{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import torch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "K = 3\n",
    "B = 4\n",
    "def f(x):\n",
    "    return K * X + B\n",
    "n = 100\n",
    "X = np.linspace(1,100,n)\n",
    "Y = f(X)\n",
    "#plt.scatter(X,Y)\n",
    "\n",
    "D = np.random.normal(0,1,n)\n",
    "Y += D\n",
    "#plt.scatter(X,Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def model(x,k,b):\n",
    "    return k * x + b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "K = torch.normal(0,1,size=(1,1),requires_grad=True)\n",
    "B = torch.normal(0,1,size=(1,1),requires_grad=True)\n",
    "\n",
    "X = torch.tensor(X)\n",
    "Y = torch.tensor(Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def squared_loss(y_hat,y):\n",
    "    return (y_hat-y) ** 2 / 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learing_rate = 0.0001\n",
    "batch_size = 10\n",
    "for j in range(500):\n",
    "    for i in range(n // batch_size):\n",
    "        x = X[i*10:i*10+10]\n",
    "        y = Y[i*10:i*10+10]\n",
    "        l = squared_loss(model(x,K,B),y)\n",
    "        print(l.sum())\n",
    "        l.sum().backward()\n",
    "        with torch.no_grad():\n",
    "            K -= K.grad * learing_rate / batch_size\n",
    "            K.grad.zero_() \n",
    "            B -= B.grad * learing_rate / batch_size\n",
    "            B.grad.zero_()\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "K,B\n",
    "model(X,K,B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x12e9a80f590>]"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(X,Y)\n",
    "plt.plot(X,model(X,K,B).detach()[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "d0l",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
